package ar.com.larreta.colegio.entidades;

import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;

import ar.com.larreta.entidades.Entidad;
import ar.com.larreta.utilidades.GeneradorClavesUnicas;

@Entity
@Table(name = "plandepago")
// Borrado logico
@SQLDelete (sql="UPDATE PlanDePago SET fechaEliminacion=CURRENT_TIMESTAMP WHERE ID=?")
// Solamente trae los que no fueron borrados logicamente
@Where(clause="fechaEliminacion IS NULL")
public class PlanDePago extends Entidad {

	private Long id;
	private String nombre;
	private Set<Item> items;

	@OneToMany (mappedBy="planDePago", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
	// Solamente trae los que no fueron borrados logicamente
	@Where(clause="fechaEliminacion IS NULL")
	public Set<Item> getItems() {
		if (items==null){
			items = new HashSet<Item>();
		}
		return items;
	}

	public void setItems(Set<Item> items) {
		this.items = items;
	}

	@Id 
	public Long getId() {
		if(id==null){
			GeneradorClavesUnicas clavesUnicas = new GeneradorClavesUnicas();
			id = clavesUnicas.getLastTime();
		}
		return id;
	}
	
	public void setId(Long id) {
		this.id = id;
	}
	
	@Basic @Column (name="nombre")
	public String getNombre() {
		return nombre;
	}
	
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	
	@Transient
	public Set getObligaciones() {
		Set obligaciones = new HashSet<Obligacion>();
		if ((items!=null) && (!items.isEmpty())){
			Iterator<Item> it = items.iterator();
			while (it.hasNext()) {
				Item item = (Item) it.next();
				Obligacion obligacion = item.getObligacion();
				if (obligacion!=null){
					obligaciones.add(item.getObligacion());
				}
			}
		}
		return obligaciones;
	}
	
	public void setObligaciones(Set obligaciones) {
		if (obligaciones!=null){
			Iterator<Obligacion> it = obligaciones.iterator();
			Date fechaActual = new Date();
			while (it.hasNext()) {
				Obligacion obligacion = (Obligacion) it.next();

				obligacion.setFechaCreacion(fechaActual);
				
				if (items==null){
					items = new HashSet<Item>();
				}
				
				Item item = null;
				if (obligacion.getItem()!=null){
					item = obligacion.getItem();
					item.setFechaUltimaModificacion(fechaActual);
				} else {
					item = new Item();
					item.setFechaCreacion(fechaActual);
					obligacion.setItem(item);					
				}
				
				item.setPlanDePago(this);
				item.agregarObligacion(obligacion);
				items.add(item);				
			}
		}
		
	}
}
